﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using accesoDatos;
using clasesBase;
using Logica;

namespace PlanificacionProduccion
{
    public partial class FrmPlanificacionDet : FrmABM
    {
        static Color colorFilaResaltada = Color.YellowGreen;
        ManejadorAyudas ayuda = new ManejadorAyudas();
        List<int> idItemsBorrar = new List<int>();

        public FrmPlanificacionDet()
        {
            InitializeComponent();
        }

        private void form_Load(object sender, System.EventArgs e)
        {
            datosEstados.DataSource = EstadoPlanificacion.listarElementos(EstadoPlanificacion.tablaBD);
            if (datosEstados.Count > 0)
            {
                cmbEstados.DisplayMember = "nombre";
                cmbEstados.ValueMember = "id";
            }

            if (base.idElemento != 0) mostrarDatos();
            else
            {
                int numeroPlan = PlanificacionProd.proximoNumero();

                DatoConfigurable datoNombrePlanificacion = new DatoConfigurable(1);
                txtNombre.Text = string.Format("{0} {1}", datoNombrePlanificacion.Valor.Trim(), numeroPlan);
                txtNumero.Text = numeroPlan.ToString();
            }
        }

        private void mostrarDatos()
        {
            PlanificacionProd elem = new PlanificacionProd(base.idElemento);

            txtId.Text = elem.ID.ToString();
            txtFecha.Text = elem.Fecha.ToString();
            txtNombre.Text = elem.Nombre.Trim();
            txtNumero.Text = elem.Numero.ToString();
            cmbEstados.SelectedValue = elem.ObjEstado.ID;

            mostrarItemsEnGrilla(elem.Items);

            colorearPrioridadAlta();
        }

        private void btnGuardar_Click(object sender, System.EventArgs e)
        {
            quitarResaltado();
            if (camposCompletos())
            {
                if (Notificador.accionGuardarConfirmada())
                {
                    // Si se tratase de un elemento nuevo, el id correspondiente es 0.
                    int idElemento = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);

                    PlanificacionProd elem = new PlanificacionProd(idElemento);
                    elem.Fecha = Convert.ToDateTime(txtFecha.Text);
                    elem.Nombre = txtNombre.Text.Trim();
                    elem.Numero = txtNumero.Text.Trim() == "" ? 0 : Convert.ToInt32(txtNumero.Text);

                    int idEstado = cmbEstados.SelectedValue == null ? 0 : Convert.ToInt32(cmbEstados.SelectedValue);
                    if (elem.ObjEstado.ID != idEstado) elem.ObjEstado = new EstadoPlanificacion(idEstado);
                    
                    elem.Items = obtenerItemsDeGrilla();

                    // Guardo la información
                    string error = elem.guardar();
                    if (error == "")
                    {
                        /* Si la actualización fue realizada correctamente, continúo. Se deben eliminar, si existiesen, 
                         * los items que se quisieron quitar */
                        foreach (int idElem in idItemsBorrar)
                        {
                            ItemPlanificacionProduccion item = new ItemPlanificacionProduccion();
                            item.ID = idElem;
                            error += " " + item.borrarElemento();
                        }
                    }

                    Notificador.resultadoABM(idElemento == 0 ? TipoOperacionABM.ALTA : TipoOperacionABM.MODIFICACION, error);
                    if (error.Trim() == "") this.Close();
                }
            }
            else Notificador.camposNoCompletos();
        }

        private bool camposCompletos()
        {
            bool completos = true;

            if (txtNombre.Text.Trim() == "") { completos = false; lblNombre.ForeColor = Color.Red; }
            if (cmbEstados.Text.Trim() == "") { completos = false; lblEstado.ForeColor = Color.Red; }
            if (grillaItems.Rows.Count ==0) { completos = false; grupoItems.ForeColor = Color.Red; }

            return completos;
        }

        private void quitarResaltado()
        {
            lblNombre.ForeColor = Color.Black;
            lblEstado.ForeColor = Color.Black;
            grupoItems.ForeColor = Color.Black;
        }

        private void soloEnteros_KeyPress(object sender, KeyPressEventArgs e)
        {
            Validador.soloEnteros_KeyPress(sender, e);
        }

        #region Items planificación
        private List<ItemPlanificacionProduccion> obtenerItemsDeGrilla()
        {
            List<ItemPlanificacionProduccion> items = new List<ItemPlanificacionProduccion>();
            foreach (DataGridViewRow fila in grillaItems.Rows)
            {
                int idItem = Convert.ToInt32(fila.Cells["colIdItem"].Value);
                ItemPlanificacionProduccion item = new ItemPlanificacionProduccion(idItem);
                
                int idProd = Convert.ToInt32(fila.Cells["colIdProducto"].Value);
                if (item.ObjProducto.ID != idProd) item.ObjProducto = new Producto(idProd);
                
                item.CantidadCajas = Convert.ToInt32(fila.Cells["colCantidad"].Value);
                item.IdPlanificacionProduccion = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);
                item.PrioridadAlta = Convert.ToBoolean(fila.Cells["colPrioridad"].Value);
                item.OrdenInterno = fila.Index + 1;

                items.Add(item);
            }

            return items;
        }

        private void mostrarItemsEnGrilla(List<ItemPlanificacionProduccion> items)
        {
            grillaItems.Rows.Clear();
            foreach (ItemPlanificacionProduccion elem in items) 
                grillaItems.Rows.Add(elem.ID, elem.ObjProducto.ID, elem.ObjProducto.Nombre.Trim(), elem.CantidadCajas, elem.PrioridadAlta);
        }

        private void colorearPrioridadAlta()
        {
            foreach (DataGridViewRow fila in grillaItems.Rows)
                if (Convert.ToBoolean(fila.Cells["colPrioridad"].Value)) fila.DefaultCellStyle.BackColor = colorFilaResaltada;
        }
        
        private void btnNuevoCaracteristicas_Click(object sender, EventArgs e)
        {
            limpiarCamposCaracteristicas();
        }

        private void limpiarCamposCaracteristicas()
        {
            txtProducto.Text = "";
            txtIdProducto.Text = "";
            txtCantidad.Text = "";
            chkPrioridadAlta.Checked = false;
        }

        private void mostrarItemSeleccionado()
        {
            DataGridViewRow filaSeleccionada = grillaItems.CurrentRow;
            if (filaSeleccionada != null)
            {
                txtProducto.Text = filaSeleccionada.Cells["colProducto"].Value.ToString();
                txtIdProducto.Text = filaSeleccionada.Cells["colIdProducto"].Value.ToString();
                txtCantidad.Text = filaSeleccionada.Cells["colCantidad"].Value.ToString();
                chkPrioridadAlta.Checked = Convert.ToBoolean(filaSeleccionada.Cells["colPrioridad"].Value);
            }
        }

        private void btnAgregarCaracteristica_Click(object sender, EventArgs e)
        {
            int idProd = txtIdProducto.Text.Trim() == "" ? 0 : Convert.ToInt32(txtIdProducto.Text);
            decimal cantidad = txtCantidad.Text.Trim() == "" ? 0 : Convert.ToDecimal(txtCantidad.Text);
            if (idProd != 0 && cantidad != 0)
            {
                string producto = txtProducto.Text.Trim();
                bool prioridadAlta = chkPrioridadAlta.Checked;
                /* En primer lugar valido si ya se asoció el producto. Si así fuera, sólo modifico la
                 * cantidad. En otro caso, creo un renglón nuevo y le asigno los valores iniciales. */
                DataGridViewRow fila = obtenerFilaGrilla(grillaItems, idProd);
                if (fila != null) // Ya existe en la grilla una fila con ese idCaracteristica
                {
                    fila.Cells["colCantidad"].Value = cantidad;
                    fila.Cells["colPrioridad"].Value = prioridadAlta;

                    if (prioridadAlta) fila.DefaultCellStyle.BackColor = colorFilaResaltada;
                    else fila.DefaultCellStyle.BackColor = grillaItems.DefaultCellStyle.BackColor;
                }
                else
                {
                    grillaItems.Rows.Add(0, idProd, producto, cantidad, prioridadAlta);
                    if (prioridadAlta) grillaItems.Rows[grillaItems.Rows.Count - 1].DefaultCellStyle.BackColor = colorFilaResaltada;
                }

                limpiarCamposCaracteristicas();
            }
            else Notificador.camposNoCompletos();
        }

        private DataGridViewRow obtenerFilaGrilla(DataGridView grilla, int idBuscado)
        {
            string columnaBuscar = "colIdProducto";

            DataGridViewRow fila;
            int indiceFilaBuscada = -1;
            for (int indiceFila = 0; indiceFila < grilla.Rows.Count; indiceFila++)
            {
                if ((int)grilla.Rows[indiceFila].Cells[columnaBuscar].Value == idBuscado)
                {
                    indiceFilaBuscada = indiceFila;
                    break;
                }
            }

            if (indiceFilaBuscada >= 0) fila = grilla.Rows[indiceFilaBuscada];
            else fila = null;

            return fila;
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            DataGridViewRow filaSeleccionada = grillaItems.CurrentRow;
            if (filaSeleccionada != null)
            {
                if (Notificador.accionBorrarConfirmada())
                {
                    /* Confirmada la acción para borrar el elemento, guardo en primer lugar su id, ya que luego debería
                     * eliminarse en la tabla de la BD según corresponda. Si el id del elemento a borrarse es 0, no lo considero
                     * ya que se trata de un elemento nuevo y no existiría previamente para borrarlo. */
                    int id = Convert.ToInt32(grillaItems.CurrentRow.Cells["colIdItem"].Value);
                    if (id != 0) idItemsBorrar.Add(id);

                    grillaItems.Rows.RemoveAt(grillaItems.CurrentRow.Index);
                }
            }
            else Notificador.elementoNoSeleccionado();
        }
        #endregion

        private void txtCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            Validador.soloDecimales_KeyPress(sender, e);
        }

        void txtProducto_LostFocus(object sender, System.EventArgs e)
        {
            ayudaProductos(false);
        }

        private void ayudaProductos(bool todos)
        {
            if (!todos)
            {
                int id = txtIdProducto.Text.Trim() == "" ? 0 : Convert.ToInt32(txtIdProducto.Text);
                string materia = txtProducto.Text.Trim();

                ayuda.mostrarElementos(Producto.tablaBD, id, materia, true);
            }
            else ayuda.mostrarElementos(Producto.tablaBD);

            txtIdProducto.Text = ayuda.IdSeleccionado.ToString();
            txtProducto.Text = ayuda.NombreSeleccionado.Trim();
        }

        private void btnTodosProductos_Click(object sender, EventArgs e)
        {
            ayudaProductos(true);
        }

        private void grillaCaracteristicas_DoubleClick(object sender, EventArgs e)
        {
            mostrarItemSeleccionado();
        }

        private void btnArriba_Click(object sender, EventArgs e)
        {
            cambiarPosicionFila(true);
        }

        private void btnAbajo_Click(object sender, EventArgs e)
        {
            cambiarPosicionFila(false);
        }

        private void cambiarPosicionFila(bool subir)
        {
            DataGridViewRow filaSeleccionada = grillaItems.CurrentRow;
            if (filaSeleccionada != null)
            {
                bool continuar = true;
                if (subir && filaSeleccionada.Index == 0) continuar = false;
                if (!subir && filaSeleccionada.Index == grillaItems.Rows.Count - 1) continuar = false;

                if (continuar)
                {
                    int indiceNuevoFila = subir ? (filaSeleccionada.Index - 1) : (filaSeleccionada.Index + 1);
                    grillaItems.Rows.RemoveAt(filaSeleccionada.Index);
                    grillaItems.Rows.Insert(indiceNuevoFila, filaSeleccionada);

                    grillaItems.CurrentCell = grillaItems.Rows[indiceNuevoFila].Cells["colProducto"];
                }

            }
            else Notificador.elementoNoSeleccionado();
        }

        private void btnFormulaActual_Click(object sender, EventArgs e)
        {
            DataGridViewRow filaSeleccionada = grillaItems.CurrentRow;
            if (filaSeleccionada != null)
            {
                int idProd = Convert.ToInt32(filaSeleccionada.Cells["colIdProducto"].Value);
                if (idProd != 0)
                {
                    int idFormActual = Producto.obtenerIdFormulaActual(idProd);
                    if (idFormActual != 0)
                    {
                        FrmFormulasDet form = FormsUnicos.ObtenerInstancia<FrmFormulasDet>(this.MdiParent);
                        form.SoloVisualizacion = true;
                        form.IdElemento = idFormActual;
                        form.ShowDialog();
                    }
                    else Notificador.formulaActualNoExistente();
                }
            }
            else Notificador.elementoNoSeleccionado();
        }
    }
}
